package co.edu.uniquindio.proyecto.entidades;

import static javax.persistence.InheritanceType.JOINED;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


/**
 * Entity implementation class for Entity: Persona
 * Clase que representa la entidad Persona
 *
 * @author Johan Sebastian Giraldo Hurtado
 * @author Universidad del Quindio
 * @version 1.0
 * @since 17/03/2014
 *
 */
@Entity
@Inheritance(strategy = JOINED)
public class Persona implements Serializable {
	
	/**
	 * Atributo que contiene el valor de serialVersionUID dentro de la clase
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Atributo que contiene el valor de cedula dentro de la clase
	 */
	@Id
	private Integer cedula;
	
	/**
	 * Atributo que contiene el valor de nombre dentro de la clase
	 */
	private String nombre;
	
	/**
	 * Atributo que contiene el valor de apellido dentro de la clase
	 */
	private String apellido;
	
	/**
	 * Atributo que contiene el valor de genero dentro de la clase
	 */
	private int genero;
	
	/**
	 * Atributo que contiene el valor de fechaNacimiento dentro de la clase
	 */
	@Temporal(TemporalType.DATE)
	private Date fechaNacimiento;
	
	
	/**
	 * Atributo que contiene el valor de cuentaUsuario dentro de la clase
	 */
	@OneToOne(mappedBy = "persona")
	private CuentaUsuario cuentaUsuario;
	
	/**
	 *  Atributo que contiene el valor de empresa dentro de la clase
	 */
	@ManyToOne
	private Empresa empresa;
	

	/**
	 * Este metodo permite obtener el valor del atributo empresa
	 * @return Retorna el valor del atributo empresa
	 */
	public Empresa getEmpresa() {
		return empresa;
	}

	/**
	 * Este metodo permite asignar un valor al atributo empresa
	 * @param empresa El valor a ser asginado al atributo empresa
	 */
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	/**
	 * Este metodo permite obtener el valor del atributo cuentaUsuario
	 * @return Retorna el valor del atributo cuentaUsuario
	 */
	public CuentaUsuario getCuentaUsuario() {
		return cuentaUsuario;
	}

	/**
	 * Este metodo permite asignar un valor al atributo cuentaUsuario
	 * @param cuentaUsuario El valor a ser asginado al atributo cuentaUsuario
	 */
	public void setCuentaUsuario(CuentaUsuario cuentaUsuario) {
		this.cuentaUsuario = cuentaUsuario;
	}

	/**
	 * Este metodo permite obtener el valor del atributo cedula
	 * @return Retorna el valor del atributo cedula
	 */
	public Integer getCedula() {
		return cedula;
	}

	/**
	 * Este metodo permite asignar un valor al atributo cedula
	 * @param cedula El valor a ser asginado al atributo cedula
	 */
	public void setCedula(Integer cedula) {
		this.cedula = cedula;
	}

	/**
	 * Este metodo permite obtener el valor del atributo nombre
	 * @return Retorna el valor del atributo nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * Este metodo permite asignar un valor al atributo nombre
	 * @param nombre El valor a ser asginado al atributo nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * Este metodo permite obtener el valor del atributo apellido
	 * @return Retorna el valor del atributo apellido
	 */
	public String getApellido() {
		return apellido;
	}

	/**
	 * Este metodo permite asignar un valor al atributo apellido
	 * @param apellido El valor a ser asginado al atributo apellido
	 */
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	/**
	 * Este metodo permite obtener el valor del atributo fechaNacimiento
	 * @return Retorna el valor del atributo fechaNacimiento
	 */
	public Date getFechaNacimiento() {
		return fechaNacimiento;
	}

	/**
	 * Este metodo permite asignar un valor al atributo fechaNacimiento
	 * @param fechaNacimiento El valor a ser asginado al atributo fechaNacimiento
	 */
	public void setFechaNacimiento(Date fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}

	/**
	 * Este metodo permite obtener el valor del atributo genero
	 * @return Retorna el valor del atributo genero
	 */
	public int getGenero() {
		return genero;
	}

	/**
	 * Este metodo permite asignar un valor al atributo genero
	 * @param genero El valor a ser asginado al atributo genero
	 */
	public void setGenero(int genero) {
		this.genero = genero;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((cedula == null) ? 0 : cedula.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Persona other = (Persona) obj;
		if (cedula == null) {
			if (other.cedula != null)
				return false;
		} else if (!cedula.equals(other.cedula))
			return false;
		return true;
	}

}
